#include<bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
int n,m,q;
int c[N],lst[N],p[N];
int a[N][5],sum[N][5];
int f[N];
int g(int l,int r){
    for(int i=1;i<=m;i++) lst[i]=0;
    for(int i=1;i<=n;i++){
        p[i]=lst[c[i]];
        lst[c[i]]=i;
        f[i]=0;
    }
    for(int i=l;i<=r;i++){
        f[i]=f[i-1]+a[i][c[i]];
        if(p[i]>=l) f[i]=max(f[i],f[p[i]]+sum[i][c[i]]-sum[p[i]][c[i]]);
    }
    return f[r];
}
void sub(){
    for(int i=1;i<=n;i++) 
        for(int j=1;j<=5;j++)
            sum[i][j]=sum[i-1][j]+a[i][j];
    int ans=g(1,n);
    printf("%lld\n",ans);
    while(q--){
        int o,x,y;
        scanf("%lld %lld %lld",&o,&x,&y);
        x^=ans;y^=ans;
        if(o==1) c[x]=y;
        else{
            ans=g(x,y);
            printf("%lld\n",ans);
        }
    }
}
const int inf=1e18;
struct node{
    int a[6][6];
    friend node operator *(node A,node B){
        node C;
        for(int i=0;i<6;i++)
            for(int j=0;j<6;j++) C.a[i][j]=-inf;
        for(int i=0;i<6;i++)
            for(int k=0;k<6;k++)
                for(int j=0;j<6;j++) C.a[i][j]=max(C.a[i][j],A.a[i][k]+B.a[k][j]);
        return C;
    }
}t[N<<2];
#define ls (x<<1)
#define rs ((x<<1)|1)
#define mid ((l+r)>>1)
void pushup(int x){
    t[x]=t[ls]*t[rs];
}
void build(int x,int l,int r){
    if(l==r){
        for(int i=0;i<6;i++)
            for(int j=0;j<6;j++) t[x].a[i][j]=-inf;
        for(int i=1;i<=5;i++) t[x].a[i][i]=a[l][i];
        t[x].a[0][0]=a[l][c[l]];t[x].a[c[l]][0]=a[l][c[l]];
        t[x].a[0][c[l]]=a[l][c[l]];t[x].a[c[l]][c[l]]=a[l][c[l]];
        return;
    }
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(x);
}
void update(int x,int l,int r,int id){
    if(l==r){
        for(int i=0;i<6;i++)
            for(int j=0;j<6;j++) t[x].a[i][j]=-inf;
        for(int i=1;i<=5;i++) t[x].a[i][i]=a[l][i];
        t[x].a[0][0]=a[l][c[l]];t[x].a[c[l]][0]=a[l][c[l]];
        t[x].a[0][c[l]]=a[l][c[l]];t[x].a[c[l]][c[l]]=a[l][c[l]];
        return;
    }
    if(id<=mid) update(ls,l,mid,id);
    else update(rs,mid+1,r,id);
    pushup(x);
}
node query(int x,int l,int r,int L,int R){
    if(L<=l&&r<=R) return t[x];
    if(R<=mid) return query(ls,l,mid,L,R);
    if(L>mid) return query(rs,mid+1,r,L,R);
    return query(ls,l,mid,L,R)*query(rs,mid+1,r,L,R);
}
signed main(){
    freopen("paint.in","r",stdin);
    freopen("paint.out","w",stdout);
    scanf("%lld %lld %lld",&n,&m,&q);
    for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) scanf("%lld",&a[i][j]);
    if(q==0||n<=500){sub();return 0;}
    build(1,1,n);
    int ans=t[1].a[0][0];
    printf("%lld\n",ans);
    while(q--){
        int o,x,y;
        scanf("%lld %lld %lld",&o,&x,&y);
        x^=ans;y^=ans;
        if(o==1) c[x]=y,update(1,1,n,x);
        else{
            ans=query(1,1,n,x,y).a[0][0];
            printf("%lld\n",ans);
        }
    }
    return 0;
}